// IO函子

  // 1. IO函子中的_value 是一个函数，这里是把函数作为值来处理
  // 2. IO函子可以把不纯的动作存储到_value中，延迟执行这个不纯的操作，包装当前的操作
  // 3. 把不纯的操作交给调用者来处理

const fp = require('lodash/fp')

class IO {
  static of (value) {
    return new IO(function() {
      return value
    })
  }

  constructor (fn) {
    this._value = fn
  }

  map (fn) {
    return new IO(fp.flowRight(fn, this._value))
  }
}

let r = IO.of(process).map(p => p.execPath)
console.log(r._value())